import java.util.Scanner;

public class Test {


    //打印自幂数
    // 一位自幂数叫独生数，三位自幂数叫水仙花数，四位自幂数叫四叶玫瑰数
    // 五位自幂数叫五角星数，六位自幂数叫六合数，七位自幂数叫北斗七星数
    // 八位自幂数叫八仙数，九位自幂数叫九九重阳数，十位自幂数叫十全十美数
    // 自幂数是一个数学概念，指的是一个n位数，其每个位上的数字的n次幂之和等于它本身
    // 例如，153是一个自幂数，因为1³+5³+3³=153
    public static void main(String[] args) {
        for (int i = 0; i < 999999; i++) {
            //先计算有几位数，每次除以10
            int count = 0;
            //为了不让输入数字i发生变化，用tmp求位数
            int tmp = i;
            while (tmp != 0){
                count++;
                tmp = tmp / 10;
            }
            //再求出i的每一位上的数字，i继续保持不变因此借用tmp，计算tmp上的每一位
            tmp = i;
            int sum = 0;
            while (tmp != 0){
                sum += Math.pow(tmp % 10,count);
                tmp /= 10;
            }
            if (sum == i){
                System.out.println(i);
            }
        }
    }


    //输出n*n的乘法口诀表，n由用户输入
    //System.out.printf("%-2d",i*j);, "-"表示输出的数左对齐（默认为右对齐）
    //加上制表符\t或者printf里面%d，%-2d可用于对齐
    public static void main10(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.printf("%d*%d=%d\t",j,i,i*j);
                //System.out.print(j + "*" + i + "=" + i*j + "\t");
            }
            System.out.println();
        }
    }


    //编写代码模拟三次密码输入的场景。
    //最多能输入三次密码，密码正确，提示“登录成功”,密码错误
    //可以重新输入，最多输入三次。三次均错，则提示退出程序
    //字符串使用方法equals比较相同
    //password.equals当中变量可以点出方法，原因看它的类型，其方法是来源于类型的
    //鼠标放在equals上按Ctrl点左键可以看到它的实现，可以看到源码
    //idea在Structure（Alt+7）点开可以把类中所有的方法列出来
    public static void main9(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int count =3;
        while (count != 0){
            System.out.print("请输入你的密码：");
            String password = scanner.nextLine();
            if(password.equals("123")){
                System.out.println("登录成功");
                break;
            }else {
                count--;
                System.out.println("你还有"+count+"次机会！");
            }
        }
    }


    //打印用“*”组成的X形图案
    //多组输入，一个整数（2~20），表示输出的行数，也表示组成“X”的反斜线和正斜线的长度
    //假设i代表行，j代表列，当i==j 或者 i+j+1 == n，此时为星号。其余的都是空格
    public static void main8(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            int n = scanner.nextInt();
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    if (i == j || i+j+1 == n){
                        System.out.print("*");
                    }else {
                        System.out.print(" ");
                    }
                }
                System.out.println();
            }
        }
    }


    //计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值
    //先是正数然后是负数，那就第一次乘1，第二次乘-1，第三次乘1，第四次乘-1，第五次...
    public static void main7(String[] args) {
        double sum = 0;
        int flag = 1;
        for (int i = 1; i <=  100 ; i++) {
            sum += 1.0/i * flag;
            flag = -flag;
        }
        System.out.println(sum);
    }


    //给定两个数，求这两个数的最大公约数
    //用辗转相除法，也称欧几里得算法
    //使用较大的数除以较小的数，然后用出现的余数去除除数，再用出现的余数去除第一余数，如此反复，直到余数为0
    //那么最后的除数就是这两个数的最大公约数
    public static void main6(String[] args) {
        int a = 18;
        int b = 24;
        int c = a % b;
        while (c != 0){
            a = b;
            b = c;
            c = a % b;
        }
        System.out.println(b);
    }


    //任何一个数字n，都可以写成 n = a*b 的形式。那么必然会有一个数字是小于等于根号 n 的
    //因此一个数一个数的除，直到除到自身可以简化为除到根号 n
    public static void main5(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int i = 2;
        for (; i <= Math.sqrt(n); i++) {
            if (n % i == 0) {
                System.out.println(n+"不是素数");
                break;
            }
        }
        if (n == 0 || n == 1){
            System.out.println(n+"不是素数");
        } else if (i > Math.sqrt(n)) {
            System.out.println(n+"是素数");
        }
    }


    //任何一个数字n,都可以写成 n = a*b 的形式。那么必然会有一个数字是小于等于 n/2 的
    //因此一个数一个数的除，直到除到自身可以简化为除到 n/2
    public static void main4(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int i = 2;
        for (; i <= n/2; i++) {
            if (n % i == 0) {
                System.out.println(n+"不是素数");
                break;
            }
        }
        if (n == 0 || n == 1){
            System.out.println(n+"不是素数");
        } else if (i > n/2) {
            System.out.println(n+"是素数");
        }
    }



    //给定一个数字，判定一个数字是否是素数
    //素数是指在一个大于1的自然数中，除了1和此整数自身外，无法被其它自然数整除的数
    //一个数一个数的除，直到除到自身
    public static void main3(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int i = 2;
        for (; i < n; i++) {
            if (n % i == 0) {
                System.out.println(n+"不是素数");
                break;
            }
        }
        if (i == n){
            System.out.println(n+"是素数");
        }
    }


    //判断多个素数
    public static void main2(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        for (int j = 1; j <= n; j++) {
            int i = 2;
            for (; i < j; i++) {
                if (j % i == 0) {
                    System.out.println(j+"不是素数");
                    break;
                }
            }
            if (i == j){
                System.out.println(j+"是素数");
            }
        }
    }


    //编写程序数一下 1到 100 的所有整数中出现多少个数字9
    // i % 10 判断个位上是否为9，i / 10 判断十位上是否为9,注意99有两个9
    public static void main1(String[] args) {
        int count = 0;
        for (int i = 1; i <= 100; i++) {
            if (i % 10 == 9) {
                //System.out.println(i);
                count++;
            }
            if (i / 10 == 9) {
                //System.out.println(i);
                count++;
            }
        }
        System.out.println(count);
    }
}
